package com.caijinbang.study.entity;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author caijb
 * @version 1.0.0
 * @date 2018-06-06 8:02
 */
@Slf4j
public class Operator implements Serializable {

    /**
     * 类型：用户
     */
    public static final String TYPE_USER = "U";
    /**
     * 类型：员工
     */
    public static final String TYPE_STAFF = "S";
    /**
     * 类型：成员
     */
    public static final String TYPE_MEMBER = "M";
    /**
     * 表达式
     */
    public static final String OPERATOR_PATTERN = "^([USMA])_(.+)_(.+)$";
    /**
     * 类型：自动系统
     */
    public static final String TYPE_AUTO_SYSTEM = "A";


    /**
     * 类型
     */
    private String type;
    /**
     * id
     */
    private String id;
    /**
     * 名称
     */
    private String name;


    private Operator() {

    }

    /**
     * 全参构造函数
     *
     * @param id   操作者id
     * @param name 操作这个姓名
     * @param type 操作者类型
     */
    private Operator(String id, String name, String type) {
        this.type = type;
        this.id = id;
        this.name = name;
    }

    /**
     * 生成Operator实例
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @param type 操作者类型
     * @return 操作者对象
     */
    public static Operator generate(String id, String name, String type) {
        return new Operator(id, name, type);
    }

    /**
     * 生成Operator实例
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @param type 操作者类型
     * @return 操作者对象
     */
    public static Operator generate(Long id, String name, String type) {
        return generate(id + "", name, type);
    }

    /**
     * 字符转换为Operator实体
     *
     * @param str 需要转换的字符
     * @return 操作者对象
     */
    public static Operator stringToOperator(String str) {
        Operator operator = null;
        if (StringUtils.isNotBlank(str)) {
            Pattern pattern = Pattern.compile(OPERATOR_PATTERN);
            Matcher matcher = pattern.matcher(str);
            if (matcher.find()) {
                operator = new Operator(matcher.group(2), matcher.group(3), matcher.group(1));
            } else {
                log.error("Operator字符串样式错误：" + str);
                return null;
            }
        }
        return operator;
    }

    /**
     * 生成用户操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateUserOperator(String id, String name) {
        return new Operator(id, name, TYPE_USER);
    }

    /**
     * 生成用户操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateUserOperator(Long id, String name) {
        String idStr = id == null ? "" : id.toString();
        return new Operator(idStr, name, TYPE_USER);
    }

    /**
     * 生成员工操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateStaffOperator(String id, String name) {
        return new Operator(id, name, TYPE_STAFF);
    }

    /**
     * 生成员工操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateStaffOperator(Long id, String name) {
        String idStr = id == null ? "" : id.toString();
        return new Operator(idStr, name, TYPE_STAFF);
    }

    /**
     * 生成成员操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateMemberOperator(String id, String name) {
        return new Operator(id, name, TYPE_MEMBER);
    }

    /**
     * 生成成员操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateMemberOperator(Long id, String name) {
        String idStr = id == null ? "" : id.toString();
        return new Operator(idStr, name, TYPE_MEMBER);
    }

    /**
     * 生成系统自动操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateAutoSystemOperator(String id, String name) {
        return new Operator(id, name, TYPE_AUTO_SYSTEM);
    }

    /**
     * 生成系统自动操作者
     *
     * @param id   操作者id
     * @param name 操作者名字
     * @return 操作者对象
     */
    public static Operator generateAutoSystemOperator(Long id, String name) {
        String idStr = id == null ? "" : id.toString();
        return new Operator(idStr, name, TYPE_AUTO_SYSTEM);
    }

    @Override
    public String toString() {
        return type + "_" + id + "_" + name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    /**
     * 是否是用户
     *
     * @return true=用户,false=非用户
     */
    public boolean isUser() {
        return Operator.TYPE_USER.equals(this.type);
    }

    /**
     * 是否是员工
     *
     * @return true=员工,false=非员工
     */
    public boolean isStaff() {
        return Operator.TYPE_STAFF.equals(this.type);
    }

    /**
     * 是否是成员
     *
     * @return true=成员,false=非成员
     */
    public boolean isMember() {
        return Operator.TYPE_MEMBER.equals(this.type);
    }

    /**
     * 是否是自动系统
     *
     * @return true=系统自动,false=非系统自动
     */
    public boolean isAutoSystem() {
        return Operator.TYPE_AUTO_SYSTEM.equals(this.type);
    }

}
